

'''
Python枚举的特点
1.Python枚举作为一个类存在，使用它需要首先导入枚举模块，然后继承并自定义需要的枚举类；
2.导入枚举模块可以是Enum(枚举值可以是任意类型)，也可以是IntEnum(枚举值只能是整型)；
3.枚举类不允许存在相同的标签；但是允许不同标签的枚举值相同，这样后者相当于前者别名；
4.不同的枚举类型，即使枚举名和枚举值都一样，比较结果也是False
5.枚举类的值不可以被外界更改
'''

#第一步：导入枚举类
from enum import Enum

#第二步：通过继承的方式，定义一个适合我们使用的枚举类
#枚举的名字一般都大写
#继承Enum模块后枚举值可以是字符串也可以是整型，如果IntEnum则必须整型
class QQVIP(Enum):
    RED = 1     
    GREEN = 2
    BLUE = 3
    BLUE_ALIAS= 3
    OTHERCOLOR = "othercolor"


print("-------------")     
#关于枚举的操作
#1.打印枚举类型，得到的是一个枚举类型
print(QQVIP.GREEN)        #打印结果：QQVIP.GREEN

#2.打印枚举名，得到的是一个字符串
print(QQVIP.GREEN.name)      #打印结果：GREEN
print(QQVIP.OTHERCOLOR.name) #打印结果：OTHERCOLOR

#3.打印枚举值
print(QQVIP.GREEN.value)     #打印结果：2

#4.测试枚举值不可更改，否则报错
#QQVIP.GREEN = 100        

#5.通过枚举名称获取枚举
print(QQVIP['GREEN'])        #打印：QQVIP.GREEN
print(QQVIP['OTHERCOLOR'])   #打印：QQVIP.OTHERCOLOR

#6.遍历枚举
#6.1.由于BLUE与BLUE_ALIAS枚举值相同，BLUE_ALIAS相当于BLUE的别名,所以没有被打印出来
for value in QQVIP:
    print(value)
'''
打印结果：
QQVIP.RED
QQVIP.GREEN
QQVIP.BLUE
QQVIP.OTHERCOLOR
'''
#6.2.可以打印出所有的枚举值包括别名,使用__members__
for value in QQVIP.__members__:
    print(value)
'''
打印结果：
RED
GREEN
BLUE
BLUE_ALIAS
OTHERCOLOR
'''
#6.3打印出枚举的所有信息,得到是元组
for value in QQVIP.__members__.items():
    print(value)
'''
('RED', <QQVIP.RED: 1>)
('GREEN', <QQVIP.GREEN: 2>)
('BLUE', <QQVIP.BLUE: 3>)
('BLUE_ALIAS', <QQVIP.BLUE: 3>)
('OTHERCOLOR', <QQVIP.OTHERCOLOR: 'othercolor'>)
'''

#7.枚举的比较
#7.1:两个枚举值可以做等值比较
result1 = QQVIP.RED == QQVIP.GREEN
print(result1)   #打印：False

#7.2:两个枚举值可以做等值比较
result2 = QQVIP.RED == QQVIP.RED
print(result2)   #打印：True

#另一种比较
result2_1 = QQVIP.RED is QQVIP.RED
print(result2_1) #打印：True

#7.3:两个枚举值不支持大小比较
#result3 = QQVIP.RED > QQVIP.GREEN
#print(result3)   #打印：报错

#7.4：枚举值和对应值比较,并不相等
result4 = QQVIP.RED == 1
print("result4")
print(result4)   

#8：不同标签但是枚举值相同，后者是前者别名
print(QQVIP.BLUE)
print(QQVIP.BLUE_ALIAS)   #打印结果都是BLUE

#9.枚举转换：通过具体值得到枚举类型
num = 2
print(QQVIP(num))  #打印：QQVIP.GREEN
